package GUI;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.YIntervalSeries;
import org.jfree.data.xy.YIntervalSeriesCollection;
import org.jfree.chart.plot.PlotOrientation;


/**
 * Nasz wykres do prezentacji na zywo efektow pracy algorytmu.
 * @author Bejo & Shade
 */
public class DynamicGraph extends JPanel {
    /** Nasze data-sety */
    private YIntervalSeries series_1, series_2, series_3;

    /** Licznik wartosci osi x */
    private int iteration = 0;

    /**
     * Konstruktor towrzy dataset-y na dane do wykresu, sam wykres oraz jPanel
     *
     */
    public DynamicGraph() {
        this.series_1 = new YIntervalSeries("najlepszy");
        this.series_2 = new YIntervalSeries("sredni");
        this.series_3 = new YIntervalSeries("najgorszy");
        YIntervalSeriesCollection dataset = new YIntervalSeriesCollection(); 
        dataset.addSeries(series_1);
        dataset.addSeries(series_2);
        dataset.addSeries(series_3);
        final JFreeChart chart = createChart(dataset);

        final ChartPanel chartPanel = new ChartPanel(chart);

        final JPanel content = new JPanel(new BorderLayout());
        content.add(chartPanel);
        chartPanel.setPreferredSize(new java.awt.Dimension(700, 200));
        add(content);
    }

    /**
     * Tworzy wykres z ustawieniami osi itp.
     * 
     * @param dataset z danymi do wykresu.
     * 
     * @return obiekt wykresu
     */
    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createXYLineChart(
            "Poziomy przystosowania osobnikow",     // tytul wykresu
            "pokolenie",                            // os-x etykieta
            "przystosowanie",                       // os-y etykieta
            dataset,                                // dataset z danymi
            PlotOrientation.VERTICAL,
            true,                                   // czy dodac legende?
            true,                                   // tooltips?
            false                                   // urls?
        ); 
  
        final XYPlot plot = result.getXYPlot();
        plot.getRangeAxis().setRange(0.0, 1.0);
        plot.getDomainAxis().setAutoRange(true);

        plot.getRangeAxis().setRange(0.0, 1.0);
        plot.getRangeAxis().setAutoRange(true);
        
        return result;
    }

    /**
     * Dodaje wartość złożoną z trzech parametrów.
     * @param value_1 parametr 1
     * @param value_2 parametr 2
     * @param value_3 parametr 3
     */
    public void pushValue(double value_1, double value_2, double value_3){
        this.series_1.add(iteration, value_1, 0, value_1+1.0);
        this.series_2.add(iteration, value_2, 0, value_2+1.0);
        this.series_3.add(iteration, value_3, 0, value_3+1.0);
        iteration++;
    }
    
    /**
     * Czyści zawartość wykresu.
     */
    public void clearGraph(){
        this.series_1.clear();
        this.series_2.clear();
        this.series_3.clear();
        iteration = 0;
    }
    
}